forprofit_counts <- profit_states_1419 %>% 
  dplyr::select(contains("count_Forprofit_")) %>% 
  summarize(across(everything(), sum, na.rm = TRUE))

nonprofit_counts <- profit_states_1419 %>% 
  dplyr::select(contains("count_Nonprofit_")) %>% 
  summarize(across(everything(), sum, na.rm = TRUE))

govt_counts <- profit_states_1419 %>% 
  dplyr::select(contains("count_Government_")) %>% 
  summarize(across(everything(), sum, na.rm = TRUE))


plot(seq(2014,2019), forprofit_counts, type = 'l', main= "Treatment Facility Counts over time", ylim = c(1000, 8000), col = 'blue', xlab = 'Year', ylab = '# Treatment Centers')
lines(seq(2014,2019), nonprofit_counts, type = 'l', main= "Non Profit Counts", col = 'red')
lines(seq(2014,2019), govt_counts, type = 'l', main= "Government Counts", col = 'green')

legend("bottomleft", c("for profit", "non profit", "government"), col = c("blue", "red", "green"), pch ='-', lwd = 2)

using map tutorial from: https://jtr13.github.io/cc19/different-ways-of-plotting-u-s-map-in-r.html#using-ggplot2-package state abbreviations from: https://www.ssa.gov/international/coc-docs/states.html

library(ggplot2)
library(maps)
library(mapdata)
library(plotly)
library(sf)

usa <- map_data('usa')
state <- map_data("state")

#merge state geo file to the for-profit information
state <- state %>% 
              left_join(state_abbrevs_df, by = c("region" = "state_names")) %>% 
              left_join(profit_states_1419, by = c('state_abbrevs' = 'STATE')) 
                                      
#plot the number of for-profit treatment centers from 2015-2019
for (i in seq(2015, 2019))
{
  plot_forprofits <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Forprofit_", i, sep = "")), group=group)) + 
                      scale_fill_gradient(low = "grey", high = "green", limits = c(0,800)) +
                      geom_polygon(color = "white") + 
                      ggtitle(paste('# For-Profit Treatment Centers in', i)) + 
                      coord_fixed(1.3)
  print(plot_forprofits)
}



ggplot(data=state, aes(x=long, y=lat, fill= change_Forprofit_1519, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "green", limits = c(0,400)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Change in # For-Profit Treatment Centers from 2015 - 2019') + 
                      coord_fixed(1.3)

for (i in seq(2015, 2019))
{
  plot_nonprofits <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Nonprofit_", i, sep = "")), group=group)) + 
                      scale_fill_gradient(low = "grey", high = "blue", limits = c(0,900)) +
                      geom_polygon(color = "white") + 
                      ggtitle(paste('# Non-Profit Treatment Centers in', i)) + 
                      coord_fixed(1.3)
  print(plot_nonprofits)
}



ggplot(data=state, aes(x=long, y=lat, fill= change_Nonprofit_1519, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "blue", limits = c(0,100)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Change in # Non-Profit Treatment Centers from 2015 - 2019') + 
                      coord_fixed(1.3)

for (i in seq(2015, 2019))
{
  plot_govt <- ggplot(data=state, aes(x=long, y=lat, fill= !!sym(paste0("count_Government_", i, sep = "")), group=group)) + 
                      scale_fill_gradient(low = "grey", high = "red", limits = c(0,250)) +
                      geom_polygon(color = "white") + 
                      ggtitle(paste('# Government Treatment Centers in', i)) + 
                      coord_fixed(1.3)
  print(plot_govt)
}




ggplot(data=state, aes(x=long, y=lat, fill= change_Government_1519, group=group)) + 
                      scale_fill_gradient(low = "grey", high = "red", limits = c(0,50)) +
                      geom_polygon(color = "white") + 
                      ggtitle('Change in # Government Treatment Centers from 2015 - 2019') + 
                      coord_fixed(1.3)


state <- "California"

par(mar=c(5, 4, 4, 12), xpd=TRUE)

plot(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "UDPYILAL", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "UDPYILAL", ]$est_total, type = 'o', ylim= c(0,10000), main = paste(state, "Substance Use Measures Over Time") ,xlab = "year", ylab = "Thousands of People in 2015-18")

lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "ILLEMMON", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "ILLEMMON", ]$est_total, col = 'blue', type = 'o')

lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "BNGDRK", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "BNGDRK", ]$est_total, col = 'red', type = 'o')

lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "TXNPILAL", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "TXNPILAL", ]$est_total, col = 'green', type = 'o')

lines(yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "PNRNMYR", ]$start_year, yearly_nsduh_data[yearly_nsduh_data$stname == state & yearly_nsduh_data$outcome == "PNRNMYR", ]$est_total, col = 'purple', type = 'o')

legend('topright',legend = c("Substance Use Disorder", "Drug use in past month", "Binge alcohol use", "Needing, not receiving tx", "pain reliever misuse"), col = c("black", "blue", "red", "green", "purple"), lty = 1,  inset=c(-0.5, 0))


plot(state_final_df[state_final_df$profit_type == "Forprofit", ]$sud, state_final_df[state_final_df$profit_type == "Forprofit",]$tx_percapita, xlab = "Substance Use Disorder Counts (in thousands)", ylab = "For profit treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Forprofit", ]))


plot(state_final_df[state_final_df$profit_type == "Nonprofit", ]$sud, state_final_df[state_final_df$profit_type == "Nonprofit",]$tx_percapita, col = "blue", xlab = "Substance Use Disorder counts (in thousands) ", ylab = "Nonprofit treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Nonprofit", ]))

plot(state_final_df[state_final_df$profit_type == "Government", ]$sud, state_final_df[state_final_df$profit_type == "Government",]$tx_percapita, col = "green", xlab = "Substance Use Disorder counts (in thousands)", ylab = "Government treatment centers per capita")
abline(lm(tx_percapita ~ sud, data = state_final_df[state_final_df$profit_type == "Government", ]))

Look at the distribution of each input variable of interest at each point in time


create_hist <- function(df, year_param, profit_param, col_param)
{
  subset_data <- df %>%
  filter(year == year_param, profit_type == profit_param)
  hist(subset_data[[col_param]], main = paste("Histogram of ",year_param, profit_param, col_param), xlab = col_param)
}

#substance use measures are roughly normal
create_hist(state_final_df, 2016, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2017, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2018, "Forprofit", "binge_drinking")

create_hist(state_final_df, 2019, "Forprofit", "binge_drinking")


create_hist(state_final_df, 2016, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2017, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2018, "Forprofit", "illicit_druguse")

create_hist(state_final_df, 2019, "Forprofit", "illicit_druguse")


create_hist(state_final_df, 2016, "Forprofit", "needing_tx")

create_hist(state_final_df, 2017, "Forprofit", "needing_tx")

create_hist(state_final_df, 2018, "Forprofit", "needing_tx")

create_hist(state_final_df, 2019, "Forprofit", "needing_tx")


create_hist(state_final_df, 2016, "Forprofit", "sud")

create_hist(state_final_df, 2017, "Forprofit", "sud")

create_hist(state_final_df, 2018, "Forprofit", "sud")

create_hist(state_final_df, 2019, "Forprofit", "sud")

#substance use measures are roughly normal
create_hist(state_final_df, 2016, "Forprofit", "count_tx")

create_hist(state_final_df, 2017, "Forprofit", "count_tx")

create_hist(state_final_df, 2018, "Forprofit", "count_tx")

create_hist(state_final_df, 2019, "Forprofit", "count_tx")

#non profit treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Nonprofit", "count_tx")

create_hist(state_final_df, 2017, "Nonprofit", "count_tx")

create_hist(state_final_df, 2018, "Nonprofit", "count_tx")

create_hist(state_final_df, 2019, "Nonprofit", "count_tx")

#non profit treatment centers are heavily skewed for all years
create_hist(state_final_df, 2016, "Government", "count_tx")

create_hist(state_final_df, 2017, "Government", "count_tx")

create_hist(state_final_df, 2018, "Government", "count_tx")

create_hist(state_final_df, 2019, "Government", "count_tx")

LS0tCnRpdGxlOiAiU0FNSFNBIE5TU0FUUyBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KZm9ycHJvZml0X2NvdW50cyA8LSBwcm9maXRfc3RhdGVzXzE0MTkgJT4lIAogIGRwbHlyOjpzZWxlY3QoY29udGFpbnMoImNvdW50X0ZvcnByb2ZpdF8iKSkgJT4lIAogIHN1bW1hcml6ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBzdW0sIG5hLnJtID0gVFJVRSkpCgpub25wcm9maXRfY291bnRzIDwtIHByb2ZpdF9zdGF0ZXNfMTQxOSAlPiUgCiAgZHBseXI6OnNlbGVjdChjb250YWlucygiY291bnRfTm9ucHJvZml0XyIpKSAlPiUgCiAgc3VtbWFyaXplKGFjcm9zcyhldmVyeXRoaW5nKCksIHN1bSwgbmEucm0gPSBUUlVFKSkKCmdvdnRfY291bnRzIDwtIHByb2ZpdF9zdGF0ZXNfMTQxOSAlPiUgCiAgZHBseXI6OnNlbGVjdChjb250YWlucygiY291bnRfR292ZXJubWVudF8iKSkgJT4lIAogIHN1bW1hcml6ZShhY3Jvc3MoZXZlcnl0aGluZygpLCBzdW0sIG5hLnJtID0gVFJVRSkpCgoKcGxvdChzZXEoMjAxNCwyMDE5KSwgZm9ycHJvZml0X2NvdW50cywgdHlwZSA9ICdsJywgbWFpbj0gIlRyZWF0bWVudCBGYWNpbGl0eSBDb3VudHMgb3ZlciB0aW1lIiwgeWxpbSA9IGMoMTAwMCwgODAwMCksIGNvbCA9ICdibHVlJywgeGxhYiA9ICdZZWFyJywgeWxhYiA9ICcjIFRyZWF0bWVudCBDZW50ZXJzJykKbGluZXMoc2VxKDIwMTQsMjAxOSksIG5vbnByb2ZpdF9jb3VudHMsIHR5cGUgPSAnbCcsIG1haW49ICJOb24gUHJvZml0IENvdW50cyIsIGNvbCA9ICdyZWQnKQpsaW5lcyhzZXEoMjAxNCwyMDE5KSwgZ292dF9jb3VudHMsIHR5cGUgPSAnbCcsIG1haW49ICJHb3Zlcm5tZW50IENvdW50cyIsIGNvbCA9ICdncmVlbicpCgpsZWdlbmQoImJvdHRvbWxlZnQiLCBjKCJmb3IgcHJvZml0IiwgIm5vbiBwcm9maXQiLCAiZ292ZXJubWVudCIpLCBjb2wgPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIpLCBwY2ggPSctJywgbHdkID0gMikKCmBgYAoKCnVzaW5nIG1hcCB0dXRvcmlhbCBmcm9tOiBodHRwczovL2p0cjEzLmdpdGh1Yi5pby9jYzE5L2RpZmZlcmVudC13YXlzLW9mLXBsb3R0aW5nLXUtcy1tYXAtaW4tci5odG1sI3VzaW5nLWdncGxvdDItcGFja2FnZQpzdGF0ZSBhYmJyZXZpYXRpb25zIGZyb206IGh0dHBzOi8vd3d3LnNzYS5nb3YvaW50ZXJuYXRpb25hbC9jb2MtZG9jcy9zdGF0ZXMuaHRtbAoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtYXBzKQpsaWJyYXJ5KG1hcGRhdGEpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHNmKQoKdXNhIDwtIG1hcF9kYXRhKCd1c2EnKQpzdGF0ZSA8LSBtYXBfZGF0YSgic3RhdGUiKQoKI21lcmdlIHN0YXRlIGdlbyBmaWxlIHRvIHRoZSBmb3ItcHJvZml0IGluZm9ybWF0aW9uCnN0YXRlIDwtIHN0YXRlICU+JSAKICAgICAgICAgICAgICBsZWZ0X2pvaW4oc3RhdGVfYWJicmV2c19kZiwgYnkgPSBjKCJyZWdpb24iID0gInN0YXRlX25hbWVzIikpICU+JSAKICAgICAgICAgICAgICBsZWZ0X2pvaW4ocHJvZml0X3N0YXRlc18xNDE5LCBieSA9IGMoJ3N0YXRlX2FiYnJldnMnID0gJ1NUQVRFJykpIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApgYGAKCgoKCmBgYHtyfQojcGxvdCB0aGUgbnVtYmVyIG9mIGZvci1wcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgZnJvbSAyMDE1LTIwMTkKZm9yIChpIGluIHNlcSgyMDE1LCAyMDE5KSkKewogIHBsb3RfZm9ycHJvZml0cyA8LSBnZ3Bsb3QoZGF0YT1zdGF0ZSwgYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9ICEhc3ltKHBhc3RlMCgiY291bnRfRm9ycHJvZml0XyIsIGksIHNlcCA9ICIiKSksIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gImdyZWVuIiwgbGltaXRzID0gYygwLDgwMCkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKHBhc3RlKCcjIEZvci1Qcm9maXQgVHJlYXRtZW50IENlbnRlcnMgaW4nLCBpKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIGNvb3JkX2ZpeGVkKDEuMykKICBwcmludChwbG90X2ZvcnByb2ZpdHMpCn0KCgpnZ3Bsb3QoZGF0YT1zdGF0ZSwgYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9IGNoYW5nZV9Gb3Jwcm9maXRfMTUxOSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAiZ3JlZW4iLCBsaW1pdHMgPSBjKDAsNDAwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUoJ0NoYW5nZSBpbiAjIEZvci1Qcm9maXQgVHJlYXRtZW50IENlbnRlcnMgZnJvbSAyMDE1IC0gMjAxOScpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCgpgYGAKCgpgYGB7cn0KZm9yIChpIGluIHNlcSgyMDE1LCAyMDE5KSkKewogIHBsb3Rfbm9ucHJvZml0cyA8LSBnZ3Bsb3QoZGF0YT1zdGF0ZSwgYWVzKHg9bG9uZywgeT1sYXQsIGZpbGw9ICEhc3ltKHBhc3RlMCgiY291bnRfTm9ucHJvZml0XyIsIGksIHNlcCA9ICIiKSksIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gImJsdWUiLCBsaW1pdHMgPSBjKDAsOTAwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUocGFzdGUoJyMgTm9uLVByb2ZpdCBUcmVhdG1lbnQgQ2VudGVycyBpbicsIGkpKSArIAogICAgICAgICAgICAgICAgICAgICAgY29vcmRfZml4ZWQoMS4zKQogIHByaW50KHBsb3Rfbm9ucHJvZml0cykKfQoKCmdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gY2hhbmdlX05vbnByb2ZpdF8xNTE5LCBncm91cD1ncm91cCkpICsgCiAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9maWxsX2dyYWRpZW50KGxvdyA9ICJncmV5IiwgaGlnaCA9ICJibHVlIiwgbGltaXRzID0gYygwLDEwMCkpICsKICAgICAgICAgICAgICAgICAgICAgIGdlb21fcG9seWdvbihjb2xvciA9ICJ3aGl0ZSIpICsgCiAgICAgICAgICAgICAgICAgICAgICBnZ3RpdGxlKCdDaGFuZ2UgaW4gIyBOb24tUHJvZml0IFRyZWF0bWVudCBDZW50ZXJzIGZyb20gMjAxNSAtIDIwMTknKSArIAogICAgICAgICAgICAgICAgICAgICAgY29vcmRfZml4ZWQoMS4zKQpgYGAKCmBgYHtyfQpmb3IgKGkgaW4gc2VxKDIwMTUsIDIwMTkpKQp7CiAgcGxvdF9nb3Z0IDwtIGdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gISFzeW0ocGFzdGUwKCJjb3VudF9Hb3Zlcm5tZW50XyIsIGksIHNlcCA9ICIiKSksIGdyb3VwPWdyb3VwKSkgKyAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX2ZpbGxfZ3JhZGllbnQobG93ID0gImdyZXkiLCBoaWdoID0gInJlZCIsIGxpbWl0cyA9IGMoMCwyNTApKSArCiAgICAgICAgICAgICAgICAgICAgICBnZW9tX3BvbHlnb24oY29sb3IgPSAid2hpdGUiKSArIAogICAgICAgICAgICAgICAgICAgICAgZ2d0aXRsZShwYXN0ZSgnIyBHb3Zlcm5tZW50IFRyZWF0bWVudCBDZW50ZXJzIGluJywgaSkpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCiAgcHJpbnQocGxvdF9nb3Z0KQp9CgoKCmdncGxvdChkYXRhPXN0YXRlLCBhZXMoeD1sb25nLCB5PWxhdCwgZmlsbD0gY2hhbmdlX0dvdmVybm1lbnRfMTUxOSwgZ3JvdXA9Z3JvdXApKSArIAogICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmlsbF9ncmFkaWVudChsb3cgPSAiZ3JleSIsIGhpZ2ggPSAicmVkIiwgbGltaXRzID0gYygwLDUwKSkgKwogICAgICAgICAgICAgICAgICAgICAgZ2VvbV9wb2x5Z29uKGNvbG9yID0gIndoaXRlIikgKyAKICAgICAgICAgICAgICAgICAgICAgIGdndGl0bGUoJ0NoYW5nZSBpbiAjIEdvdmVybm1lbnQgVHJlYXRtZW50IENlbnRlcnMgZnJvbSAyMDE1IC0gMjAxOScpICsgCiAgICAgICAgICAgICAgICAgICAgICBjb29yZF9maXhlZCgxLjMpCmBgYAoKCgpgYGB7cn0KCnN0YXRlIDwtICJDYWxpZm9ybmlhIgoKcGFyKG1hcj1jKDUsIDQsIDQsIDEyKSwgeHBkPVRSVUUpCgpwbG90KHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlVEUFlJTEFMIiwgXSRzdGFydF95ZWFyLCB5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJVRFBZSUxBTCIsIF0kZXN0X3RvdGFsLCB0eXBlID0gJ28nLCB5bGltPSBjKDAsMTAwMDApLCBtYWluID0gcGFzdGUoc3RhdGUsICJTdWJzdGFuY2UgVXNlIE1lYXN1cmVzIE92ZXIgVGltZSIpICx4bGFiID0gInllYXIiLCB5bGFiID0gIlRob3VzYW5kcyBvZiBQZW9wbGUgaW4gMjAxNS0xOCIpCgpsaW5lcyh5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJJTExFTU1PTiIsIF0kc3RhcnRfeWVhciwgeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiSUxMRU1NT04iLCBdJGVzdF90b3RhbCwgY29sID0gJ2JsdWUnLCB0eXBlID0gJ28nKQoKbGluZXMoeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiQk5HRFJLIiwgXSRzdGFydF95ZWFyLCB5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJCTkdEUksiLCBdJGVzdF90b3RhbCwgY29sID0gJ3JlZCcsIHR5cGUgPSAnbycpCgpsaW5lcyh5ZWFybHlfbnNkdWhfZGF0YVt5ZWFybHlfbnNkdWhfZGF0YSRzdG5hbWUgPT0gc3RhdGUgJiB5ZWFybHlfbnNkdWhfZGF0YSRvdXRjb21lID09ICJUWE5QSUxBTCIsIF0kc3RhcnRfeWVhciwgeWVhcmx5X25zZHVoX2RhdGFbeWVhcmx5X25zZHVoX2RhdGEkc3RuYW1lID09IHN0YXRlICYgeWVhcmx5X25zZHVoX2RhdGEkb3V0Y29tZSA9PSAiVFhOUElMQUwiLCBdJGVzdF90b3RhbCwgY29sID0gJ2dyZWVuJywgdHlwZSA9ICdvJykKCmxpbmVzKHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlBOUk5NWVIiLCBdJHN0YXJ0X3llYXIsIHllYXJseV9uc2R1aF9kYXRhW3llYXJseV9uc2R1aF9kYXRhJHN0bmFtZSA9PSBzdGF0ZSAmIHllYXJseV9uc2R1aF9kYXRhJG91dGNvbWUgPT0gIlBOUk5NWVIiLCBdJGVzdF90b3RhbCwgY29sID0gJ3B1cnBsZScsIHR5cGUgPSAnbycpCgpsZWdlbmQoJ3RvcHJpZ2h0JyxsZWdlbmQgPSBjKCJTdWJzdGFuY2UgVXNlIERpc29yZGVyIiwgIkRydWcgdXNlIGluIHBhc3QgbW9udGgiLCAiQmluZ2UgYWxjb2hvbCB1c2UiLCAiTmVlZGluZywgbm90IHJlY2VpdmluZyB0eCIsICJwYWluIHJlbGlldmVyIG1pc3VzZSIpLCBjb2wgPSBjKCJibGFjayIsICJibHVlIiwgInJlZCIsICJncmVlbiIsICJwdXJwbGUiKSwgbHR5ID0gMSwgIGluc2V0PWMoLTAuNSwgMCkpCgpgYGAKCgpgYGB7cn0KCnBsb3Qoc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIkZvcnByb2ZpdCIsIF0kc3VkLCBzdGF0ZV9maW5hbF9kZltzdGF0ZV9maW5hbF9kZiRwcm9maXRfdHlwZSA9PSAiRm9ycHJvZml0IixdJHR4X3BlcmNhcGl0YSwgeGxhYiA9ICJTdWJzdGFuY2UgVXNlIERpc29yZGVyIENvdW50cyAoaW4gdGhvdXNhbmRzKSIsIHlsYWIgPSAiRm9yIHByb2ZpdCB0cmVhdG1lbnQgY2VudGVycyBwZXIgY2FwaXRhIikKYWJsaW5lKGxtKHR4X3BlcmNhcGl0YSB+IHN1ZCwgZGF0YSA9IHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJGb3Jwcm9maXQiLCBdKSkKCgpwbG90KHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJOb25wcm9maXQiLCBdJHN1ZCwgc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIk5vbnByb2ZpdCIsXSR0eF9wZXJjYXBpdGEsIGNvbCA9ICJibHVlIiwgeGxhYiA9ICJTdWJzdGFuY2UgVXNlIERpc29yZGVyIGNvdW50cyAoaW4gdGhvdXNhbmRzKSAiLCB5bGFiID0gIk5vbnByb2ZpdCB0cmVhdG1lbnQgY2VudGVycyBwZXIgY2FwaXRhIikKYWJsaW5lKGxtKHR4X3BlcmNhcGl0YSB+IHN1ZCwgZGF0YSA9IHN0YXRlX2ZpbmFsX2RmW3N0YXRlX2ZpbmFsX2RmJHByb2ZpdF90eXBlID09ICJOb25wcm9maXQiLCBdKSkKCnBsb3Qoc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIkdvdmVybm1lbnQiLCBdJHN1ZCwgc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIkdvdmVybm1lbnQiLF0kdHhfcGVyY2FwaXRhLCBjb2wgPSAiZ3JlZW4iLCB4bGFiID0gIlN1YnN0YW5jZSBVc2UgRGlzb3JkZXIgY291bnRzIChpbiB0aG91c2FuZHMpIiwgeWxhYiA9ICJHb3Zlcm5tZW50IHRyZWF0bWVudCBjZW50ZXJzIHBlciBjYXBpdGEiKQphYmxpbmUobG0odHhfcGVyY2FwaXRhIH4gc3VkLCBkYXRhID0gc3RhdGVfZmluYWxfZGZbc3RhdGVfZmluYWxfZGYkcHJvZml0X3R5cGUgPT0gIkdvdmVybm1lbnQiLCBdKSkKCgpgYGAKCgoKTG9vayBhdCB0aGUgZGlzdHJpYnV0aW9uIG9mIGVhY2ggaW5wdXQgdmFyaWFibGUgb2YgaW50ZXJlc3QgYXQgZWFjaCBwb2ludCBpbiB0aW1lCmBgYHtyfQoKY3JlYXRlX2hpc3QgPC0gZnVuY3Rpb24oZGYsIHllYXJfcGFyYW0sIHByb2ZpdF9wYXJhbSwgY29sX3BhcmFtKQp7CiAgc3Vic2V0X2RhdGEgPC0gZGYgJT4lCiAgZmlsdGVyKHllYXIgPT0geWVhcl9wYXJhbSwgcHJvZml0X3R5cGUgPT0gcHJvZml0X3BhcmFtKQogIGhpc3Qoc3Vic2V0X2RhdGFbW2NvbF9wYXJhbV1dLCBtYWluID0gcGFzdGUoIkhpc3RvZ3JhbSBvZiAiLHllYXJfcGFyYW0sIHByb2ZpdF9wYXJhbSwgY29sX3BhcmFtKSwgeGxhYiA9IGNvbF9wYXJhbSkKfQoKYGBgCgpgYGB7cn0KCiNzdWJzdGFuY2UgdXNlIG1lYXN1cmVzIGFyZSByb3VnaGx5IG5vcm1hbApjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNiwgIkZvcnByb2ZpdCIsICJiaW5nZV9kcmlua2luZyIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE3LCAiRm9ycHJvZml0IiwgImJpbmdlX2RyaW5raW5nIikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTgsICJGb3Jwcm9maXQiLCAiYmluZ2VfZHJpbmtpbmciKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOSwgIkZvcnByb2ZpdCIsICJiaW5nZV9kcmlua2luZyIpCgpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNiwgIkZvcnByb2ZpdCIsICJpbGxpY2l0X2RydWd1c2UiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNywgIkZvcnByb2ZpdCIsICJpbGxpY2l0X2RydWd1c2UiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOCwgIkZvcnByb2ZpdCIsICJpbGxpY2l0X2RydWd1c2UiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOSwgIkZvcnByb2ZpdCIsICJpbGxpY2l0X2RydWd1c2UiKQoKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTYsICJGb3Jwcm9maXQiLCAibmVlZGluZ190eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE3LCAiRm9ycHJvZml0IiwgIm5lZWRpbmdfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOCwgIkZvcnByb2ZpdCIsICJuZWVkaW5nX3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTksICJGb3Jwcm9maXQiLCAibmVlZGluZ190eCIpCgpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNiwgIkZvcnByb2ZpdCIsICJzdWQiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNywgIkZvcnByb2ZpdCIsICJzdWQiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOCwgIkZvcnByb2ZpdCIsICJzdWQiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOSwgIkZvcnByb2ZpdCIsICJzdWQiKQpgYGAKYGBge3J9CiNmb3IgcHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIGFyZSBoZWF2aWx5IHNrZXdlZCBmb3IgYWxsIHllYXJzCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE2LCAiRm9ycHJvZml0IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTcsICJGb3Jwcm9maXQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxOCwgIkZvcnByb2ZpdCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE5LCAiRm9ycHJvZml0IiwgImNvdW50X3R4IikKYGBgCgpgYGB7cn0KI25vbiBwcm9maXQgdHJlYXRtZW50IGNlbnRlcnMgYXJlIGhlYXZpbHkgc2tld2VkIGZvciBhbGwgeWVhcnMKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTYsICJOb25wcm9maXQiLCAiY291bnRfdHgiKQpjcmVhdGVfaGlzdChzdGF0ZV9maW5hbF9kZiwgMjAxNywgIk5vbnByb2ZpdCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE4LCAiTm9ucHJvZml0IiwgImNvdW50X3R4IikKY3JlYXRlX2hpc3Qoc3RhdGVfZmluYWxfZGYsIDIwMTksICJOb25wcm9maXQiLCAiY291bnRfdHgiKQpgYGAKYGBge3J9CiNub24gcHJvZml0IHRyZWF0bWVudCBjZW50ZXJzIGFyZSBoZWF2aWx5IHNrZXdlZCBmb3IgYWxsIHllYXJzCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE2LCAiR292ZXJubWVudCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE3LCAiR292ZXJubWVudCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE4LCAiR292ZXJubWVudCIsICJjb3VudF90eCIpCmNyZWF0ZV9oaXN0KHN0YXRlX2ZpbmFsX2RmLCAyMDE5LCAiR292ZXJubWVudCIsICJjb3VudF90eCIpCmBgYAoK